SHA-1 全名是 Secure Hash Algorithm 1。是由美國 NIST(國家標準技術研究所) 選出的 密碼雜湊函数 - CHF。
與 MD5 相同,SHA-1 也是 Merkle–Damgård 架構 產生的 CHF,只是由 MD5 的 128-bit 增長到 160-bit。不過如同 MD5,SHA-1 也同樣被王小云教授「破解」了。一般是建議不要再使用,可能也只剩下比對資料的用途。
Digest 越長,所需要破解的難度則越高,不過由於 CHF 也需要非常快的速度,所以複雜及時間的取捨需要大量的數學研究。值得我們心存感恩的使用。
我們一樣用 OpenSSL 來做一個極簡易的例子。與 MD5 的介面基本上是一模一樣,所以可以參考 MD5 的文章。
require 'openssl'
OpenSSL::Digest::SHA1.new('abcefg').base64digest
# => "FtjX5Yohb+jpELQoQK84r8xte/w="
OpenSSL::Digest::SHA1.new('abcefi').base64digest
# 明明只差最後一個字元,但產生的 digest 完全不一樣
# => "Bwt90QIPHa8KjeH3gYlTk3FjEFI="
若要計算一個檔案的 SHA1 Digest,比如我電腦中有一碗很好吃的一幸舍拉麵的照片(IMG_2041.jpeg):
require 'openssl'
filepath = './IMG_2041.jpeg'
sha1 = OpenSSL::Digest::SHA1.new
# 以 binary, 'b' 的方式開檔案
File.open(filepath, "rb") do |f|
buf = ""
# 16384 bits = 2048 bytes = SHA-1 能計算的最大長度
while f.read(16384, buf)
# 一直把讀進來的內容丟給 SHA-1
sha1 << buf
end
end
# 最後即可得到SHA-1的 digest 囉!
sha1.base64digest
=> "fDnCXhFpsJOegHU5JF/DyFOc/0E="
# 以上繁雜的步驟可由 #file 解決 XD
OpenSSL::Digest::SHA1.file(filepath).base64digest
=> "fDnCXhFpsJOegHU5JF/DyFOc/0E="